package com.example.chamberlainserver.mapper;

import com.example.chamberlainserver.Entry.UserActionLog;
import com.example.chamberlainserver.dto.UserActionLogQueryDTO;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用户操作日志Mapper接口
 */
@Mapper
public interface UserActionLogMapper {
    
    /**
     * 插入操作日志
     * @param actionLog 操作日志对象
     * @return 影响行数
     */
    @Insert("INSERT INTO user_action_log (user_id, username, user_role, module, operation, description, method, request_url, request_ip, " +
            "request_params, status, error_msg, operate_time, duration, create_time) " +
            "VALUES (#{userId}, #{username}, #{userRole}, #{module}, #{operation}, #{description}, #{method}, #{requestUrl}, #{requestIp}, " +
            "#{requestParams}, #{status}, #{errorMsg}, #{operateTime}, #{duration}, #{createTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(UserActionLog actionLog);
    
    /**
     * 获取指定时间段内的操作日志
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作日志列表
     */
    @Select("SELECT * FROM user_action_log WHERE operate_time BETWEEN #{startTime} AND #{endTime} ORDER BY operate_time DESC")
    List<UserActionLog> getActionLogsByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
    
    /**
     * 获取指定用户的操作日志
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 操作日志列表
     */
    @Select("SELECT * FROM user_action_log WHERE user_id = #{userId} ORDER BY operate_time DESC LIMIT #{limit}")
    List<UserActionLog> getActionLogsByUserId(@Param("userId") int userId, @Param("limit") int limit);
    
    /**
     * 获取指定时间段内的操作类型分布
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作类型和数量的列表
     */
    @Select("SELECT operation, COUNT(*) as count " +
            "FROM user_action_log " +
            "WHERE operate_time BETWEEN #{startTime} AND #{endTime} " +
            "GROUP BY operation " +
            "ORDER BY count DESC")
    List<Map<String, Object>> getOperationDistribution(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
    
    /**
     * 获取指定时间段内的模块访问分布
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 模块和访问次数的列表
     */
    @Select("SELECT module, COUNT(*) as count " +
            "FROM user_action_log " +
            "WHERE operate_time BETWEEN #{startTime} AND #{endTime} " +
            "GROUP BY module " +
            "ORDER BY count DESC")
    List<Map<String, Object>> getModuleDistribution(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
    
    /**
     * 获取指定时间段内的操作总数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作总数
     */
    @Select("SELECT COUNT(*) FROM user_action_log WHERE operate_time BETWEEN #{startTime} AND #{endTime}")
    int getActionCountByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
    
    /**
     * 获取指定操作类型在指定时间段内的数量
     * @param operation 操作类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作数量
     */
    @Select("SELECT COUNT(*) FROM user_action_log WHERE operation = #{operation} AND operate_time BETWEEN #{startTime} AND #{endTime}")
    int getActionCountByOperation(@Param("operation") String operation, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
    
    /**
     * 分页查询操作日志
     * @param query 查询条件
     * @return 操作日志列表
     */
    List<UserActionLog> pageActionLogs(UserActionLogQueryDTO query);
    
    /**
     * 统计符合条件的操作日志总数
     * @param query 查询条件
     * @return 总记录数
     */
    Long countActionLogs(UserActionLogQueryDTO query);
}